﻿/// <reference path="jquery-1.8.0.js" />
/// <reference path="underscore.js" />
/// <reference path="central.core.js" />





///////////////////////////////////////////////////////////////
//  набор утилит для Central framework
//  автор:          Central
//  зависит от:     central.js
//                  underscore.js
///////////////////////////////////////////////////////////////

(function (central) {

    "use strict";

    ///////////////////////////////////////////////////////////////
    //  отрисовка UI для фильтров в FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////

    central.utils.drawFilters = function (items, $container, l) {
        var fc = $(document.createElement('div'));
        fc.attr('id', 'filters'+ l);
        fc.addClass('ui-querybuilder-level'+ l);
        fc.html('<span id="level' + l
            + '" data-operator="' + items.LogicalOperator + '">'
            + central.utils.checkLogOperatorName(items.LogicalOperator) + '</span>');        
        for (var i = 0; i < items.FilterParams.length; i++) {
            var $filterName = $(document.createElement('div'));
            var $closeButton = $(document.createElement('div'));
            $closeButton.attr('id', 'close');
            $filterName.attr('class', 'ui-querybuilder-filter');
            var txt = '"' + items.FilterParams[i].DisplayName + '" ' +
                central.utils.checkOperatorName(items.FilterParams[i].Operator) + ' ' +
                items.FilterParams[i].Value;
            $filterName.text(txt);
            $filterName.append($closeButton);
            fc.append($filterName);
        }       
        if (items.JsonFilterManagers.length > 0) {
            for (var i = 0; i < items.JsonFilterManagers.length; i++) {
                var $fci = $(document.createElement('div'));
                $fci.attr('id', "ui-querybuilder-filtercontainer" + (l+1));
                central.utils.drawFilters(items.JsonFilterManagers[i], $fci, l+1);
                fc.append($fci);
            }
        }
        $container.append(fc);
    }
        




    ///////////////////////////////////////////////////////////////
    //  отрисовка UI для сортировки в FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////

    central.utils.drawSorters = function (items, $container) {
        $container.append('<div class=\"ui-querybuilder-title\">Сортировка</div>');
        for (var i = 0; i < items.SortParams.length; i++) {
            var $sorterName = $(document.createElement('div'));
            var $closeButton = $(document.createElement('div'));
            $closeButton.attr('id', 'close');
            $sorterName.attr('class', 'ui-querybuilder-filter');
            var txt = '"' + items.SortParams[i].DisplayName + '" ' + ' ' + central.utils.checkSortName(items.SortParams[i].Sort);
            $sorterName.text(txt);
            $sorterName.append($closeButton);
            $container.append($sorterName);
        }        
    }





    ///////////////////////////////////////////////////////////////
    //  отрисовка UI для сортировки в FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////

    central.utils.drawGrouper = function (items, $container) {
        $container.append('<div class=\"ui-querybuilder-title\">Группировка</div>');
        for (var i = 0; i < items.GroupParams.length; i++) {
            var $grouperName = $(document.createElement('div'));
            var $closeButton = $(document.createElement('div'));
            $closeButton.attr('id', 'close');
            $grouperName.attr('class', 'ui-querybuilder-filter');
            var txt = '"' + items.GroupParams[i].DisplayName+'"';
            $grouperName.text(txt);
            $grouperName.append($closeButton);
            $container.append($grouperName);
        }
    }



    ///////////////////////////////////////////////////////////////
    //  возращает название фильтра для UI при отрисовке
    //  текущих FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////

    central.utils.checkOperatorName = function (name) {
        return _.find(central.utils.types,
            function (model) { return model.name == name; }).displayName;
    };





    ///////////////////////////////////////////////////////////////
    //  возращает название фильтра для UI при отрисовке
    //  текущих FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////

    central.utils.checkLogOperatorName = function (name) {
        return _.find(central.utils.typelogical,
            function (model) { return model.name == name; }).displayName;
    };





    ///////////////////////////////////////////////////////////////
    //  возращает название сортировки для UI при отрисовке
    //  текущих FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////

    central.utils.checkSortName = function (name) {
        return _.find(central.utils.typesort,
            function (model) { return model.name == name; }).displayName;
    };




    ///////////////////////////////////////////////////////////////
    //  перечисление для типов фильтров при 
    //  формировании FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////

    central.utils.types = [
        { type: 1, name: 'Contains', displayName: 'содержит' },
        { type: 1, name: 'DoesNotContain', displayName: 'не содержит' },
        { type: 1, name: 'StartsWith', displayName: 'начинается на' },
        { type: 1, name: 'DoesNotStartsWith', displayName: 'не начинается на' },
        { type: 1, name: 'EndsWith', displayName: 'заканчивается на' },
        { type: 1, name: 'DoesNotEndsWith', displayName: 'не заканчивается на' },
        { type: 1, name: 'IsNull', displayName: 'пусто' },
        { type: 1, name: 'IsNotNull', displayName: 'не пусто' },
        { type: 1, name: 'IsEqualTo', displayName: 'равно' },
        { type: 1, name: 'IsNotEqualTo', displayName: 'не равно' },
        { type: 1, name: 'IsGreaterThan', displayName: 'больше' },
        { type: 1, name: 'IsGreaterThanOrEqualTo', displayName: 'больше или равно' },
        { type: 1, name: 'IsLessThan', displayName: 'меньше' },
        { type: 1, name: 'IsLessThanOrEqualTo', displayName: 'меньше или равно' },
        { type: 2, name: 'IsNull', displayName: 'пусто' },
        { type: 2, name: 'IsNotNull', displayName: 'не пусто' },
        { type: 3, name: 'IsNull', displayName: 'пусто' },
        { type: 3, name: 'IsNotNull', displayName: 'не пусто' },
        { type: 0, name: 'IsNull', displayName: 'пусто' },
        { type: 0, name: 'IsNotNull', displayName: 'не пусто' },
        { type: 0, name: 'IsNull', displayName: 'пусто' },
        { type: 0, name: 'IsNotNull', displayName: 'не пусто' },
        { type: 0, name: 'IsGreaterThan', displayName: 'больше' },
        { type: 0, name: 'IsGreaterThanOrEqualTo', displayName: 'больше или равно' },
        { type: 0, name: 'IsLessThan', displayName: 'меньше' },
        { type: 0, name: 'IsLessThanOrEqualTo', displayName: 'меньше или равно' }
    ];





    ///////////////////////////////////////////////////////////////
    //  перечисление для типов логических фильтров при
    //  формировании FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////
    central.utils.typelogical = [
        { type: 0, name: 'And', displayName: 'Логическое И' },
        { type: 1, name: 'Or', displayName: 'Логическое ИЛИ' }
    ];


    ///////////////////////////////////////////////////////////////
    //  перечисление для типов сортировки фильтров при
    //  формировании FilterDefinition
    //  автор:          Central
    //  зависит от:     central.js
    ///////////////////////////////////////////////////////////////
    central.utils.typesort = [
        { type: 0, name: 'Descending', displayName: 'по убыванию' },
        { type: 1, name: 'Ascending', displayName: 'по возрастранию' }
    ];


})(central);